package edu.geo.dao;

import java.io.Serializable;
import java.util.List;

import edu.geo.containers.geom.impl.LineSegment;
import edu.geo.containers.geom.impl.Point;
import edu.geo.exception.GeoInfoException;

/**
 * 
 * @author alejandro.sanchez
 *
 */
public interface IGeometryDao extends Serializable {
	
	/**
	 * Inserta un punto al dominio de puntos en caso que este no haya sido agregado. Si 
	 * el punto y a existe, se lanza una excepción.
	 * @param point
	 * @return El identificador del punto en la base de datos en caso de que se haya insertado
	 *         satisfactoriamente.
	 *         
	 *  @throws GeoInfoException en caso de algún error en el acceso a la base de datos.
	 *         
	 */
	public int insertPoint(Point point) throws GeoInfoException;
	
	/**
	 * Inserta un segmento de línea al dominio geométrico.
	 * 
	 * @param lineSegment Un segmento de línea con sus extremos válidos en el dominio geométrico.
	 * @return El identificador en la base de datos si el segmento de línea fue agregado satisfactoriamente, false en otro caso.
	 * 
	 * @throws GeoInfoException en caso de algún error en el acceso a la base de datos.
	 */
	public int insertLineSegment(LineSegment lineSegment) throws GeoInfoException;
	
	
	/**
	 * 
	 * @param id
	 * @return
	 */			
	public Point retrievePoint(int id) throws GeoInfoException;
	
	
	/**
	 * 
	 * @param id
	 * @return
	 */			
	public LineSegment retrieveLineSegment(int id) throws GeoInfoException;
	
	/**
	 * 
	 * @param point
	 */
	public void populatePointId( Point point ) throws GeoInfoException;
	
	/**
	 * 
	 * @param point
	 */
	public void populateLineSegmentId( LineSegment lineSegment ) throws GeoInfoException;
	
	/**
	 * 
	 * @param point
	 */
	public void populatePointGeom( Point point ) throws GeoInfoException;
	
	/**
	 * 
	 * @param point
	 */
	public void populateLineSegmentGeom( LineSegment lineSegment ) throws GeoInfoException;
	
	
	/**
	 * 	
	 * @param geomDomainId Identificador de un domino geométrico existente.
	 * @return La lista de puntos asociados al dominio geométrico.
	 * @throws GeoInfoException Una excepción en caso de que ocurra algún error.
	 */
	public List<Point> retrievePoints( int geomDomainId ) throws GeoInfoException;
	
	/**
	 * 
	 * @param geomDomainId Identificador de un domino geométrico existente.
	 * @return Lista de segmentos asociados al dominio geométrico.
	 * @throws GeoInfoException Una excepción en caso de que ocurra algún error.
	 */
	public List<LineSegment> retrieveLineSegments( int geomDomainId ) throws GeoInfoException;
	
	/**
	 * 
	 * @param feature Un objeto geométrico de tipo punto.
	 * @return El id del feature si este existe, en otro caso, retornará -1.
	 * @throws GeoInfoException Si la geometría del feature es nula o ocurre un error en el acceso a la base de datos
	 */
	public int verifyPointExistence( Point feature ) throws GeoInfoException;	
	
	/**
	 * 
	 * @param feature Un objeto geométrico de tipo segmento de línea.
	 * @return El id del feature si este existe, en otro caso, retornará -1.
	 * @throws GeoInfoException Si la geometría del feature es nula o ocurre un error en el acceso a la base de datos
	 */
	public int verifyLineSegmentExistenceByGeom( LineSegment feature ) throws GeoInfoException;
	
	/**
	 * 
	 * @param feature Un objeto geométrico de tipo segmento de línea.
	 * @return El id del feature si este existe, en otro caso, retornará -1.
	 * @throws GeoInfoException Si la geometría del feature es nula o ocurre un error en el acceso a la base de datos
	 */
	public int verifyLineSegmentExistenceByid( LineSegment feature ) throws GeoInfoException;
		
	public void deleteUnreferencedPoints() throws GeoInfoException;
	
	public void deleteUnreferencedLineSegments() throws GeoInfoException;
}
